#ifndef SERVICIOPARTIDA_H
#define	SERVICIOPARTIDA_H

/**
 * Esta clase sirve para interactuar con la/las partida/partidas que se encuen-
 * tran en el servidor de manera de poder:
 * 1º_ Obtener la lista de las partidas existentes en el servidor.
 * 2º_ Unirse a una partida existente.
 * 3º_ Crear y jugar una partida.
 */

#include <vector>
#include "Servicio.h"
#include "PartidaServicioConstantes.h"
#include "Partida.h"
#include "MotorJuego.h"
#include "MundoServicio.h"
#include "ProtocoloConstantes.h"

using namespace std;
using namespace TP::Juego;
using namespace TP::Juego::Motorizacion;
using namespace TP::Comunicacion;

namespace TP { namespace Servicios {

class PartidaServicio: public Servicio {
public:
    /**
     * Crea un servicio de partidas.
     */
    PartidaServicio();

    /**
     * Libera los recursos asociados con la instancia.
     */
    virtual ~PartidaServicio();
    
    virtual void iniciar();
    
    virtual void finalizar();
    
    /**
     * Procesa un mensaje recibido de un cliente y en caso de poder interpretar-
     * lo, genera una respuesta y la envía al usuario que realizo la consulta.
     * @param pMensajero Objeto encargado de enviar la respuesta del servicio.
     * @param pMensaje Consulta a resolver.
     */
    void mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje);
    
    MotorJuego* setMotorJuego (MotorJuego* pMotor);
    
    MundoServicio* setMundoServicio (MundoServicio* pServicio);

private:

    void __listarPartidas(IMensajero* pMensajero);
    
    void __unirAPartida(IMensajero* pMensajero, vector<string>& pComando);
    
    void __crearPartida(IMensajero* pMensajero, vector<string>& pComando);
    
    bool partidaExistente(const string& pNombrePartida);
    
    
    MotorJuego* _motorJuego;
    MundoServicio* _mundoSrv;
    
};
    
}}


#endif	/* SERVICIOPARTIDA_H */

